home *** CD-ROM | disk | FTP | other *** search
/ Nibble Magazine / nib10.dsk / APPLE ART GALLERY.bas < prev    next >
BASIC Source File  |  2023-02-26  |  20KB  |  565 lines

  1. 2  REM *******************************
  2. 3  REM *   APPLE ART GALLERY         *
  3. 4  REM *   BY EDGAR J. YOUNG         *
  4. 5  REM *   COPYRIGHT (C) 1982        *
  5. 6  REM *   BY MICRO-SPARC INC        *
  6. 7  REM *   LINCOLN, MA. 01773        *
  7. 8  REM *   ALL RIGHTS RESERVED       *
  8. 9  REM *******************************
  9. 35  LOMEM: 24576
  10. 40  HGR2 : TEXT : HOME : VTAB 7: HTAB 9: PRINT " APPLE ART GALLERY": PRINT : PRINT 
  11. 50  HTAB 9: PRINT "COPYRIGHT (C) 1982": PRINT : PRINT 
  12. 60  HTAB 9: PRINT "BY  MICRO-SPARC, INC."
  13. 80  GOSUB 320: REM  VARIABLE INITIALIZATION
  14. 90  VTAB 23: HTAB 6: PRINT "PRESS SPACE BAR TO CONTINUE..."
  15. 92  POKE  -16368,0
  16. 94 A =  RND(1): IF  PEEK( -16384) <128 GOTO 94: REM  RANDOMIZES RND(I)
  17. 100  REM  INSTRUCTIONS
  18. 110  TEXT : HOME : PRINT 
  19. 120  PRINT "  THIS PROGRAM RANDOMLY DISPLAYS A"
  20. 130  PRINT "VARIETY OF GRAPHIC ART FORMS.   TO"
  21. 140  PRINT "CONTROL IT, USE THE FOLLOWING SINGLE"
  22. 150  PRINT "KEY INSTRUCTIONS AT ANY TIME:"
  23. 160  PRINT : PRINT "   I - DISPLAY THESE 'INSTRUCTIONS'"
  24. 170  PRINT : PRINT "   H - 'HOLD' THIS PICTURE UNTIL <H>"
  25. 180  HTAB 8: PRINT "IS PRESSED AGAIN"
  26. 190  PRINT : PRINT "   S - 'SEQUENTIALLY' RUN ALL ART FORMS"
  27. 200  PRINT : PRINT "   R - 'RUN' ONE ART FORM CONTINUOUSLY"
  28. 210  HTAB 8: PRINT "UNTIL THE SPACE BAR IS PRESSED"
  29. 220  PRINT : PRINT "   N - START OR STOP 'NUMBERING'"
  30. 230  HTAB 8: PRINT "THE ART FORMS"
  31. 240  PRINT : PRINT "   SPACE BAR - CONTINUE RANDOM DISPLAYS"
  32. 250  PRINT : PRINT "   ESC - ESCAPE THIS PROGRAM"
  33. 260  CALL 62450: REM  CLEAR HGR2 SCREEN
  34. 265  POKE  -16368,0
  35. 270  PRINT : HTAB 20: PRINT "YOUR COMMAND? ";: GET A$:A =  ASC(A$)
  36. 280  IF A = A1  OR A = A2 GOTO 100
  37. 290  IF A = A5  THEN FL = 1: GOTO 670
  38. 300  GOSUB 520
  39. 310  GOTO 100
  40. 320  REM   CONSTANTS AND DIMENSIONS
  41. 400 PI = 3.141592654:CX = 140:CY = 95:RM = 90:RP = 45
  42. 410 A1 = 73:A2 = 72:A3 = 83:A4 = 82:A5 = 78:A6 = 32:A7 = 27
  43. 420 FL = 0:FS = 0:FR = 0:P = 0
  44. 430 CS = 0:CG = 0
  45. 440 PK =  -16384
  46. 450 NF = 33
  47. 460 C$ = "":C1$ = ""
  48. 470  DIM P(4,150,2): REM 
  49. 480  RETURN 
  50. 490  REM  PROGRAM CONTROL
  51. 500  IF  PEEK(PK) <128  THEN  RETURN 
  52. 510  GET A$:A =  ASC(A$)
  53. 520  IF A < >A1  AND A < >A2  AND A < >A3  AND A < >A4  AND A < >A5  AND A < >A6  AND A < >A7  THEN  RETURN 
  54. 530  IF A = A1  THEN  CALL 54915:FS = 0:FR = 0: GOTO 100
  55. 540  REM  CALL 54915 RESETS THE GOSUB STACK TO ZERO WITHOUT AFFECTING ANYTHING ELSE
  56. 550  IF A = A2  THEN  GET A$: RETURN 
  57. 560  IF A = A3 GOTO 640
  58. 570  IF A = A4 GOTO 610
  59. 580  IF A = A5  THEN FL =  ABS(FL -1): RETURN 
  60. 590  IF A = A6  THEN  CALL 54915:FS = 0:FR = 0: GOTO 670
  61. 600  TEXT : HOME : END 
  62. 610  CALL 54915
  63. 620 FS = 0
  64. 630 FR = 1: TEXT : HOME : VTAB 10: PRINT "  SELECT THE ART FORM (1 TO ";NF;") THAT YOUWANT TO RUN CONTINUOUSLY.": GOTO 800
  65. 640  CALL 54915
  66. 650 FR = 0
  67. 660 FS = 1: TEXT : HOME : VTAB 10: PRINT "  SELECT THE ART FORM (1 TO ";NF;") THAT YOUWANT TO START THE SEQUENCE FROM.": GOTO 800
  68. 670  REM  ART FORM SELECTION
  69. 680  IF FR = 1 GOTO 710
  70. 690  IF FS = 1  THEN NN = NN +1: IF NN = NF +1  THEN NN = 1
  71. 700  IF FS < >1  THEN NN =  INT( RND(1) *NF +1)
  72. 710  ON  INT(NN/10 +1) GOTO 720,740,760,780
  73. 720  ON NN GOSUB 4990,3320,2950,1070,1290,1700,3850,4060,3320
  74. 730  GOTO 670
  75. 740  ON NN -9 GOSUB 1060,1300,1400,2600,3330,4320,1980,1690,1080,3340
  76. 750  GOTO 670
  77. 760  ON NN -19 GOSUB 2320,3800,1280,3340,1500,1050,1710,3330,1970,1300
  78. 770  GOTO 670
  79. 780  ON NN -29 GOSUB 3400,1040,3760,3450
  80. 790  GOTO 670
  81. 800  REM  ART FORM NUMBER INPUT
  82. 810  PRINT : PRINT "  PRESS <RETURN> WHEN YOU HAVE TYPED IN YOUR ENTRY...";
  83. 820 IX =  POS(0) +1
  84. 830  GET A$:C =  ASC(A$): IF C <49  OR C >57  THEN  HTAB IX: GOTO 830
  85. 840 C1$ = A$:C$ = A$: PRINT A$;:X =  POS(0) +1
  86. 850  GET A$:C =  ASC(A$): IF C = 13 GOTO 920
  87. 860  IF C = 8  THEN X =  POS(0): HTAB X: PRINT " ";: HTAB X: GOTO 830
  88. 870  IF C <48  OR C >57  THEN  HTAB X: GOTO 850
  89. 880 C$ = C1$ +A$: PRINT A$;:X =  POS(0) +1
  90. 890  GET A$:C =  ASC(A$): IF C = 13 GOTO 920
  91. 900  IF C = 8  THEN X =  POS(0): HTAB X: PRINT " ";: HTAB X:C$ = C1$: GOTO 850
  92. 910  GOTO 890
  93. 920 NN =  VAL(C$): IF NN <1  OR NF <NN  THEN  HTAB IX: PRINT "  ";: HTAB IX: GOTO 830
  94. 930  IF FS = 1  THEN NN = NN -1
  95. 935  HOME : VTAB 10: HTAB 14: PRINT "I'M THINKING"
  96. 940  GOTO 670
  97. 950  REM  ART FORM NUMBERING SUBROUTINE
  98. 960  IF FL = 1 GOTO 980
  99. 970  GOTO 1010
  100. 980  TEXT : HOME : VTAB 10: HTAB 13: PRINT "ART FORM # ";NN
  101. 990  CALL 62450: FOR DE = 1 TO 100: GOSUB 500: NEXT DE
  102. 1000  REM  CHOOSE SCREEN COLOR - WHITE ON BLACK OR BLACK ON WHITE
  103. 1010  IF  RND(1) -.5 >0  THEN  HGR2 : HCOLOR= 7:CS = 4: RETURN 
  104. 1020  HCOLOR= 7: HGR2 : HPLOT CX,CY: CALL 62454: HCOLOR= 4:CS = 7: RETURN 
  105. 1030  REM  ART FORMS 31,25,10,4,18
  106. 1040  FOR DE = 1 TO 200: GOSUB 500: NEXT DE:P =  INT( RND(1) *11 +10): GOTO 1100
  107. 1050 P =  INT( RND(1) *21 +90): GOTO 1100
  108. 1060 P =  INT( RND(1) *51 +20): GOTO 1100
  109. 1070 P =  INT(( RND(1) *21 +20)/2) *2: GOTO 1100
  110. 1080 P =  INT( RND(1) *61 +20)
  111. 1090  REM  DEFINE POINTS AROUND A CIRCLE
  112. 1100 I = 1:AN = 2 *PI/P
  113. 1110 P(1,1,1) = CX:P(1,1,2) = CY -RM:K = P
  114. 1120  FOR J = 2 TO  INT(P/2 +1):PX = RM * SIN((J -1) *AN):P(I,J,1) = CX +PX:P(I,K,1) = CX -PX:P(I,J,2) = CY -RM * COS((J -1) *AN):P(I,K,2) = P(I,J,2):K = K -1: GOSUB 500: NEXT J
  115. 1130  GOSUB 950
  116. 1140  REM  GRAPH ROUTINE
  117. 1150  IF NN < >31 GOTO 1180
  118. 1160  FOR J = 1 TO P -1: FOR K = J +1 TO P: GOSUB 1260: NEXT K,J
  119. 1170  RETURN 
  120. 1180 J = 1: IF NN = 18  THEN J =  INT( RND(1) *P +1)
  121. 1190  FOR K = 1 TO P: GOSUB 1260: NEXT K: IF NN = 25  THEN  RETURN 
  122. 1200  IF NN = 4  OR NN = 18 GOTO 1230
  123. 1210 J = 2: FOR K = 3 TO P: GOSUB 1260: NEXT K
  124. 1220 J = P: FOR K = 1 TO P: GOSUB 1260: NEXT K: RETURN 
  125. 1230  IF NN = 18 GOTO 1250
  126. 1240 J = P/2 +1: FOR K = 1 TO P: GOSUB 1260: NEXT K: RETURN 
  127. 1250 J =  INT( RND(1) *P +1): FOR K = 1 TO P: GOSUB 1260: NEXT K: RETURN 
  128. 1260  HPLOT P(I,J,1),P(I,J,2) TO P(I,K,1),P(I,K,2): GOSUB 500: RETURN 
  129. 1270  REM  ART FORMS 22,5,11
  130. 1280 P =  INT( RND(1) *8 +5):C = P: GOTO 1330
  131. 1290 P =  INT( RND(1) *9 +3):C =  INT( RND(1) *21 +30): GOTO 1330
  132. 1300 P = 33
  133. 1310  IF NN = 11  THEN C =  INT( RND(1) *8 +5)
  134. 1320  IF NN = 29  THEN C =  INT( RND(1) *11 +20)
  135. 1330  FOR DE = 1 TO 200: GOSUB 500: NEXT DE
  136. 1340 AN = 2 *PI/P: FOR I = 1 TO P:P(1,I,1) = RP * SIN(AN *I):P(1,I,2) = RP * COS(AN *I): GOSUB 500: NEXT I
  137. 1350  GOSUB 950
  138. 1360  REM  GRAPH ROUTINE
  139. 1370  FOR I = 1 TO C:PY = CY -RP * COS(I *2 *PI/C):PX = CX +RP * SIN(I *2 *PI/C): HPLOT PX,PY -RP
  140. 1380  FOR A = 1 TO P: HPLOT  TO PX +P(1,A,1),PY -P(1,A,2): NEXT A: GOSUB 500: NEXT I: RETURN 
  141. 1390  REM  ART FORM 12
  142. 1400 P =  INT( RND(1) *25 +6)
  143. 1410  FOR DE = 1 TO 200: GOSUB 500: NEXT 
  144. 1420 IX = 130/P:IY = 90/P:X = 140:Y = 95:PX = 130:PY = 0
  145. 1430  GOSUB 950
  146. 1440  REM  GRAPH ROUTINE
  147. 1450 GC = 2
  148. 1460  FOR I = 1 TO P +1
  149. 1470  HPLOT X,Y +PY TO X +PX,Y TO X,Y -PY TO X -PX,Y TO X,Y +PY: GOSUB 500
  150. 1480 PX = PX -IX:PY = PY +IY: NEXT I: RETURN 
  151. 1490  REM  ART FORM 24
  152. 1500  FOR DE = 1 TO 300: GOSUB 500: NEXT DE
  153. 1510 X =  INT( RND(1) *180):Y =  INT( RND(1) *192)
  154. 1520  GOSUB 2740: GOSUB 950
  155. 1530  REM  GRAPH ROUTINE
  156. 1540  HPLOT X,Y
  157. 1550  FOR I = 1 TO 300
  158. 1560 L =  INT( RND(1) *RM -RP)
  159. 1570 IX = 0:IY = 0: IF  SGN( RND(1) -.5) >0  THEN IX = L: GOTO 1590
  160. 1580 IY = L
  161. 1590 X = X +IX:Y = Y +IY
  162. 1600  IF X >279  THEN X = X -10: GOTO 1600
  163. 1610  IF X <0  THEN X = X +10: GOTO 1610
  164. 1620  IF Y >191  THEN Y = Y -10: GOTO 1620
  165. 1630  IF Y <0  THEN Y = Y +10: GOTO 1630
  166. 1640  HPLOT  TO X,Y
  167. 1650  POKE 6, INT((X +Y)/2): POKE 7, INT( RND(1) *4 +1): CALL 768
  168. 1660  GOSUB 500
  169. 1670  NEXT I: RETURN 
  170. 1680  REM  ART FORM 17,6,26
  171. 1690 P =  INT( RND(1) *91 +10):PR =  INT( RND(1) *51 +10):N =  INT( RND(1) *4 +3): GOTO 1730
  172. 1700 P =  INT( RND(1) *121 +30):PR = 100:N = 1: GOTO 1730
  173. 1710 N =  INT( RND(1) *5 +2):R = 130
  174. 1720 P =  INT( RND(1) *91 +10):PR =  INT( RND(1) *51 +10): GOTO 1740
  175. 1730 R = 130
  176. 1740  IF PR = 100  THEN S =  INT(P/2): GOTO 1770
  177. 1750 A = 1 -PR/100
  178. 1760 S =  INT(( - ATN(A/ SQR( -A *A +1)) +1.5708) *P/PI +.5)
  179. 1770 I = 1:J = 1
  180. 1780 I = I +1:J = J +S: IF J >P  THEN J = J -P
  181. 1790  IF I <P  AND J = 1  AND P <150  THEN P = P +1: GOTO 1750
  182. 1800  GOSUB 500: IF I <P GOTO 1780
  183. 1810 AN = 2 *PI/P:IR = CY/CX *R:K = P:P(1,1,1) = CX:P(1,1,2) = CY -IR
  184. 1820  FOR I = 2 TO  INT(P/2 +1)
  185. 1830 A = (I -1) *AN:PX = R * SIN(A):P(1,I,1) = CX +PX:P(1,K,1) = CX -PX:P(1,I,2) = CY -IR * COS(A):P(1,K,2) = P(1,I,2):K = K -1
  186. 1840  GOSUB 500: NEXT I
  187. 1850  IF R = 130  THEN  GOSUB 950
  188. 1860  REM  GRAPH ROUTINE
  189. 1870 J = 1: HPLOT P(1,J,1),P(1,J,2)
  190. 1880  FOR I = 1 TO P
  191. 1890 J = J +S: IF J >P  THEN J = J -P
  192. 1900  HPLOT  TO P(1,J,1),P(1,J,2)
  193. 1910  GOSUB 500: NEXT I
  194. 1920 R = R * COS(S *PI/P) -3
  195. 1930 N = N -1: IF N = 0  THEN  RETURN 
  196. 1940  IF NN = 26 GOTO 1720
  197. 1950  GOTO 1810
  198. 1960  REM  ART FORMS 28 & 16
  199. 1970 PR = 1: GOTO 1990
  200. 1980 PR =  -1: FOR DE = 1 TO 200: GOSUB 500: NEXT 
  201. 1990 P =  INT( RND(1) *12 +4):PR = PR *( RND(1) *.45 +.25)
  202. 2000 R = 90:PR = R *PR
  203. 2010 A = 0:SA = 0:CA = 0:J = 0
  204. 2020  FOR I = 1 TO 2 *P
  205. 2030 P(1,I,1) = CX +R * SIN((I -1)/P *PI)
  206. 2040 P(1,I,2) = CY -R * COS((I -1)/P *PI)
  207. 2050 I = I +1
  208. 2060 P(1,I,1) = CX +PR * SIN((I -1)/P *PI)
  209. 2070 P(1,I,2) = CY -PR * COS((I -1)/P *PI)
  210. 2080  GOSUB 500
  211. 2090  NEXT I
  212. 2100  GOSUB 950
  213. 2110  REM  GRAPH ROUTINE
  214. 2120  FOR I = 1 TO 2 *P
  215. 2130  HPLOT CX,CY TO P(1,I,1),P(1,I,2)
  216. 2140  NEXT I
  217. 2150  HPLOT P(1,1,1),P(1,1,2)
  218. 2160  FOR I = 1 TO 2 *P
  219. 2170  HPLOT  TO P(1,I,1),P(1,I,2)
  220. 2180  GOSUB 500
  221. 2190  NEXT I
  222. 2200  HPLOT  TO P(1,1,1),P(1,1,2)
  223. 2210  IF PR <0 GOTO 2300
  224. 2220  FOR I = 1 TO 2 *P
  225. 2230 I = I +1
  226. 2240 A = (I -1)/P *PI:SA =  SIN(A):CA =  COS(A)
  227. 2250  FOR J = 1 TO PR
  228. 2260  HPLOT P(1,I -1,1),P(1,I -1,2) TO CX +J *SA,CY -J *CA
  229. 2270  GOSUB 500
  230. 2280  NEXT J
  231. 2290  NEXT I
  232. 2300  RETURN 
  233. 2310  REM  ART FORM 20
  234. 2320 L =  INT( RND(1) *6 +4)
  235. 2330 C =  INT( RND(1) *11 +5)
  236. 2340 N =  RND(1)
  237. 2350 I = 1: GOSUB 2460
  238. 2360  FOR J = 1 TO L: FOR K = 1 TO 2:P(3,J,K) = P(1,J,K): NEXT K,J
  239. 2370  FOR DE = 1 TO 300: GOSUB 500: NEXT DE: GOSUB 950
  240. 2380  REM  GRAPH ROUTINE
  241. 2390  FOR N = 2 TO C
  242. 2400  FOR J = 1 TO L: FOR K = 1 TO 2:P(2,J,K) = P(3,J,K): NEXT K,J
  243. 2410 I = 3: GOSUB 2460
  244. 2420  FOR M = 1 TO L: HPLOT P(2,M,1),P(2,M,2) TO P(3,M,1),P(3,M,2): NEXT M
  245. 2430  GOSUB 500: NEXT N
  246. 2440  FOR M = 1 TO L: HPLOT P(3,M,1),P(3,M,2) TO P(1,M,1),P(1,M,2): NEXT M
  247. 2450  RETURN 
  248. 2460  REM  POINT LOCATION
  249. 2470 X = 20 + RND(N) *239:Y = 20 + RND(N) *151
  250. 2480 A =  RND(N) *2 *PI:CA =  COS(A):SA =  SIN(A)
  251. 2490 R =  RND(N) *90
  252. 2500 IX = X +R *CA
  253. 2510 IY = Y +R *SA
  254. 2520  GOSUB 500
  255. 2530  IF IX <0  OR IX >279  OR IY <0  OR IY >191  THEN R = R -1: GOTO 2500
  256. 2540  FOR M = 1 TO L
  257. 2550 P(I,M,1) = X +R *M/L *CA
  258. 2560 P(I,M,2) = Y +R *M/L *SA
  259. 2570  NEXT M
  260. 2580  RETURN 
  261. 2590  REM  ART FORM 13
  262. 2600  FOR DE = 1 TO 300: GOSUB 500: NEXT DE
  263. 2610  GOSUB 2740
  264. 2620  GOSUB 950
  265. 2630  REM  GRAPH ROUTINE
  266. 2640 Y = 191 * RND(1):X = 0
  267. 2650  HPLOT X,Y
  268. 2660 I =  RND(1) *4 +1:X = X +I: IF X >279 GOTO 2720
  269. 2670 Y = 191 * RND(X)
  270. 2680  HPLOT  TO X,Y
  271. 2690  POKE 6, INT(Y): POKE 7, INT(I): CALL 768
  272. 2700  GOSUB 500
  273. 2710  GOTO 2660
  274. 2720  RETURN 
  275. 2730  REM  'BOOP' SOUND ROUTINE, POKE 6 AND 7 TO VARY PITCH AND DURATION
  276. 2740  POKE 768,173
  277. 2750  POKE 769,48
  278. 2760  POKE 770,192
  279. 2770  POKE 771,136
  280. 2780  POKE 772,208
  281. 2790  POKE 773,4
  282. 2800  POKE 774,198
  283. 2810  POKE 775,7
  284. 2820  POKE 776,240
  285. 2830  POKE 777,8
  286. 2840  POKE 778,202
  287. 2850  POKE 779,208
  288. 2860  POKE 780,246
  289. 2870  POKE 781,166
  290. 2880  POKE 782,6
  291. 2890  POKE 783,76
  292. 2900  POKE 784,0
  293. 2910  POKE 785,3
  294. 2920  POKE 786,96
  295. 2930  RETURN 
  296. 2940  REM  ART FORM 19
  297. 2950  FOR DE = 1 TO 300: GOSUB 500: NEXT DE: GOSUB 950
  298. 2960  REM  GRAPH ROUTINE
  299. 2970 IX = 279:IY = 191:A = 100:R = 1:J = 1
  300. 2980  GOSUB 3090
  301. 2990 N = 50 -20 * RND(1)
  302. 3000 J = J +1: IF J >6  THEN  RETURN 
  303. 3010  FOR I = 1 TO N:P(1,I,1) = IX * RND(R):P(1,I,2) = IY * RND(R): NEXT 
  304. 3020  POKE 783, INT( RND(R) *90 +A)
  305. 3030 C =  INT( RND(R) *8): HCOLOR= C: IF (CS = 7  AND (C = 7  OR C = 3))  OR (CS = 4  AND (C = 0  OR C = 4)) GOTO 3030
  306. 3040 X =  RND(R) *IX:Y =  RND(R) *IY
  307. 3050  FOR I = 1 TO N: HPLOT X,Y TO P(1,I,1),P(1,I,2): CALL 768: NEXT 
  308. 3060  GOSUB 500
  309. 3070  GOTO 2990
  310. 3080  REM  LAZER SOUND ROUTINE, POKE 783 FOR TONE, POKE 769 FOR MULTIPLE TONES
  311. 3090  POKE 768,160
  312. 3100  POKE 769,1
  313. 3110  POKE 770,162
  314. 3120  POKE 771,0
  315. 3130  POKE 772,138
  316. 3140  POKE 773,24
  317. 3150  POKE 774,233
  318. 3160  POKE 775,1
  319. 3170  POKE 776,208
  320. 3180  POKE 777,252
  321. 3190  POKE 778,141
  322. 3200  POKE 779,48
  323. 3210  POKE 780,192
  324. 3220  POKE 781,232
  325. 3230  POKE 782,224
  326. 3240  POKE 784,208
  327. 3250  POKE 785,242
  328. 3260  POKE 786,136
  329. 3270  POKE 787,208
  330. 3280  POKE 788,237
  331. 3290  POKE 789,96
  332. 3300  RETURN 
  333. 3310  REM  ART FORMS 20-22
  334. 3320 RS = 0:EL = 1:SL =  RND(1) *.5: GOTO 3350
  335. 3330 SL =  RND(1) *.4 +.4:EL = SL:RS =  RND(1) *(.8 -SL): GOTO 3350
  336. 3340 SL =  RND(1):EL =  RND(1):RS = (1 -SL) * RND(1) *.8: IF  ABS(EL -SL) <.3 GOTO 3340
  337. 3350 NS =  INT( RND(1) *8 +5)
  338. 3360 OV =  INT( RND(1) *2 +1)
  339. 3370 NA =  INT(( RND(1) *41 +120)/NS)
  340. 3380 NR = OV *NA/(( INT(NA/OV) *OV +1) *NS)
  341. 3390  GOTO 3540
  342. 3400 RS =  RND(1) *.5:SL =  RND(1) *.36 +.04:EL = SL
  343. 3410 NS =  INT( RND(1) *6 +5)
  344. 3420 NR = (1 -EL -RS)/(NS *(SL +4/RM))
  345. 3430 NA =  INT(NR *( RND(1) *41 +100))
  346. 3440  GOTO 3540
  347. 3450  IF  RND(1) -.5 >0  THEN RS = 0: GOTO 3470
  348. 3460 RS =  RND(1) *.2 +.1
  349. 3470 SL =  RND(1) *.04 +.06
  350. 3480  IF  RND(1) -.5 >0  THEN EL = SL: GOTO 3500
  351. 3490 EL =  RND(1) *SL *.5
  352. 3500 NR =  RND(1) *31 +20
  353. 3510 NA =  INT( RND(1) *31 +40)
  354. 3520 NS =  INT(500/NA)
  355. 3530  IF  ABS(NR/NS - INT(NR/NS)) <.1 GOTO 3500
  356. 3540  FOR DE = 1 TO 200: GOSUB 500: NEXT DE: GOSUB 950
  357. 3550  REM  GRAPH ROUTINE
  358. 3560 DI =  SGN( RND(1) -.5)
  359. 3570 IA = 2 *PI *NR/NA *DI
  360. 3580  FOR I = 0 TO NS -1
  361. 3590 ISR = RM *(1 -EL -RS)/NA
  362. 3600 ILR = RM *(1 -RS -SL)/NA
  363. 3610  IF NN = 9  OR NN = 27  OR NN = 19  THEN ISR = ISR *2:ILR = ILR *2
  364. 3620 LR = RM *(RS +SL):SR = RM *RS
  365. 3630 AN = I *2 *PI/NS *DI
  366. 3640  IF NN = 9  OR NN = 27  OR NN = 19  THEN AN = AN -PI *DI/NS
  367. 3650  FOR J = 0 TO NA
  368. 3660 CA =  COS(AN):SA =  SIN(AN)
  369. 3670  HPLOT CX +SR *SA,CY -SR *CA TO CX +LR *SA,CY -LR *CA
  370. 3680 AN = AN +IA:LR = LR +ILR:SR = SR +ISR
  371. 3690  IF LR >RM +ILR/4  AND NA - INT(NA/2) *2 = 0  THEN ILR =  -ILR:LR = LR +2 *ILR:ISR =  -ISR:SR = SR +2 *ISR
  372. 3700  IF LR >RM +ILR/4  THEN ILR =  -ILR:LR = LR +ILR:ISR =  -ISR:SR = SR +ISR
  373. 3710  GOSUB 500
  374. 3720  NEXT J
  375. 3730  NEXT I
  376. 3740  RETURN 
  377. 3750  REM  ART FORMS 32,21,7
  378. 3760  IF  RND(1) -.5 >0  THEN C =  RND(1) *41 +30: GOTO 3780
  379. 3770 C = 100
  380. 3780 NS =  INT( RND(1) *C/8 +4)
  381. 3790 P =  INT( RND(1) *11 +5): GOTO 3830
  382. 3800 C = 200
  383. 3810 NS =  INT(( RND(1) *C/8 +4)/2) *2
  384. 3820 P =  INT(( RND(1) *11 +2)/2) *2 +1
  385. 3830 PR =  RND(1) *.6 +.2
  386. 3840  GOTO 3890
  387. 3850 C =  RND(1) *20 +40
  388. 3860 NS =  INT( RND(1) *3 +3)
  389. 3870 P =  INT( RND(1) *5 +5)
  390. 3880 PR =  -1
  391. 3890 R = RM:IA = PI/P
  392. 3900  IF NS = 1  THEN IR = 0: GOTO 3920
  393. 3910 IR = C *R/(NS -1)/100
  394. 3920  FOR DE = 1 TO 200: GOSUB 500: NEXT DE
  395. 3930  GOSUB 950
  396. 3940  REM  GRAPH ROUTINE
  397. 3950  FOR I = 1 TO NS
  398. 3960  IF I = NS  AND NN = 32 GOTO 4040
  399. 3970  HPLOT CX,CY -R
  400. 3980 AN = 0:RR = R *PR
  401. 3990  FOR J = 1 TO P
  402. 4000 AN = AN +IA: HPLOT  TO CX +RR * SIN(AN),CY -RR * COS(AN)
  403. 4010 AN = AN +IA: HPLOT  TO CX +R * SIN(AN),CY -R * COS(AN)
  404. 4020  GOSUB 500: NEXT J
  405. 4030 R = R -IR
  406. 4040  NEXT I
  407. 4050  RETURN 
  408. 4060  REM  ART FORM 8
  409. 4070 N =  INT( RND(1) *2 +2)
  410. 4080 HO =  RND(1) *.8 +.2
  411. 4090 HI =  RND(1) *HO +1 -HO
  412. 4100  IF  RND(1) -.5 >0  THEN RO = 0:RI = 0: GOTO 4140
  413. 4110 RO =  RND(1) *PI *3/18
  414. 4120  IF N = 2  THEN RI = 0: IF  RND(1) -.5 >0  THEN RI = RO
  415. 4130  IF N = 3  THEN RI = RO/2
  416. 4140 P =  INT( RND(1) *18 +12)
  417. 4150 S =  INT(P *( RND(1) *.5 +.25))
  418. 4160 C =  INT( RND(1) *2 +1)
  419. 4170  GOSUB 4670
  420. 4180  GOSUB 4770
  421. 4190  GOSUB 4880
  422. 4200  GOSUB 950
  423. 4210  REM  GRAPH ROUTINE
  424. 4220  HPLOT P(1,1,1),P(1,1,2)
  425. 4230 I = 1:L = 1:J = 1
  426. 4240  FOR K = 1 TO P +1
  427. 4250 I = I +L: IF I >N +1  THEN L =  -1:I = I -2
  428. 4260 J = J +S: IF J >P  THEN J = J -P
  429. 4270  HPLOT  TO P(I,J,1),P(I,J,2)
  430. 4280  GOSUB 500
  431. 4290  IF I < >1 GOTO 4250
  432. 4300 L = 1: NEXT K
  433. 4310  RETURN 
  434. 4320  REM  ART FORM 15
  435. 4330 N = 1
  436. 4340 HO =  RND(1) *.5 +.5
  437. 4350 HI =  RND(1) *(1 -HO) +HO
  438. 4360 RO =  RND(1) *PI *1/9:RI = RO
  439. 4370 P =  INT( RND(1) *18 +13)
  440. 4380 S =  INT(P *( RND(1) *.25 +.25))
  441. 4390 C =  INT( RND(1) *2 +1)
  442. 4400  GOSUB 4670
  443. 4410  GOSUB 4770
  444. 4420 P1 = P:S1 = S
  445. 4430 P = P1 +25
  446. 4440 S =  INT(S1/P1 *P)
  447. 4450  GOSUB 4670
  448. 4460  GOSUB 4880
  449. 4470  GOSUB 950
  450. 4480  REM  GRAPH ROUTINE
  451. 4490 J = 1
  452. 4500  HPLOT P(1,1,1),P(1,1,2)
  453. 4510  FOR K = 1 TO P1 +1
  454. 4520 J = J +S1: IF J >P1  THEN J = J -P1
  455. 4530  HPLOT  TO P(2,J,1),P(2,J,2)
  456. 4540 J = J +S1: IF J >P1  THEN J = J -P1
  457. 4550  HPLOT  TO P(1,J,1),P(1,J,2)
  458. 4560  NEXT K
  459. 4570 J = 1: HCOLOR=  INT( RND(1) *2 +5)
  460. 4580  HPLOT P(3,1,1),P(3,1,2)
  461. 4590  FOR K = 1 TO P +1
  462. 4600 J = J +S: IF J >P  THEN J = J -P
  463. 4610  HPLOT  TO P(4,J,1),P(4,J,2)
  464. 4620 J = J +S: IF J >P  THEN J = J -P
  465. 4630  HPLOT  TO P(3,J,1),P(3,J,2)
  466. 4640  NEXT K
  467. 4650  RETURN 
  468. 4660  REM  INSURE THAT NO LINE DUPLICATION OCCURS
  469. 4670 I = 1:J = 1
  470. 4680 I = I +1
  471. 4690  FOR K = 1 TO 2 *N
  472. 4700 J = J +S: IF J >P  THEN J = J -P
  473. 4710  NEXT K
  474. 4720  IF I <P  AND J = 1  THEN P = P +1: GOTO 4670
  475. 4730  GOSUB 500
  476. 4740  IF I <P GOTO 4680
  477. 4750  RETURN 
  478. 4760  REM  DEFINE OUTSIDE HOOPS
  479. 4770  IF C = 1  THEN IX = 90:IY = 274:J = 1:K = 2:Y = CY
  480. 4780  IF C = 2  THEN IX = 130:IY = 186:J = 2:K = 1:Y = CX
  481. 4790 HO = HO *IX:RO = HO * SIN(RO):IX = 5 +RO:IY = IY -RO
  482. 4800 L = N +1:IA = 2 *PI/P
  483. 4810  FOR I = 1 TO P:AN = I *IA:SA =  SIN(AN):CA =  COS(AN)
  484. 4820 P(1,I,J) = IX +RO *CA:P(1,I,K) = Y +HO *SA
  485. 4830 P(L,I,J) = IY +RO *CA:P(L,I,K) = P(1,I,K)
  486. 4840  GOSUB 500
  487. 4850  NEXT I
  488. 4860  RETURN 
  489. 4870  REM  DEFINE INSIDE HOOP(S)
  490. 4880 PX = IY -IX:IA = 2 *PI/P
  491. 4890  IF C = 1  THEN IX = 90:IY = CX:J = 1:K = 2:Y = CY
  492. 4900  IF C = 2  THEN IX = 130:IY = CY:J = 2:K = 1:Y = CX
  493. 4910 HI = HI *IX:RI = HI * SIN(RI)
  494. 4920  IF N = 1  THEN PX =  RND(1) *PX/6 +PX/6:IX = IY -PX:IY = IY +PX:L = 3:M = 4
  495. 4930  IF N = 2  THEN IX = IY:L = 2:M = 4
  496. 4940  IF N = 3  THEN PX = ( RND(1) *.8 -.4) *PX:IX = IY -PX:IY = IY +PX:L = 2:M = 3
  497. 4950  FOR I = 1 TO P:AN = I *IA:SA =  SIN(AN):CA =  COS(AN)
  498. 4960 P(L,I,J) = IX +RI *CA:P(L,I,K) = Y +HI *SA
  499. 4970 P(M,I,J) = IY +RI *CA:P(M,I,K) = P(L,I,K)
  500. 4980  GOSUB 500: NEXT I: RETURN 
  501. 4990  REM  ART FORM 1
  502. 5000 N =  INT( RND(1) *4 +3)
  503. 5010 AN = PI/N
  504. 5020 R = ( RND(1) *.2 +.3) *RM:RR = 100
  505. 5030 M =  INT( RND(1) *30/N +10)
  506. 5040 IY = R/M
  507. 5050 IX = (RR -R) * TAN(AN)/M
  508. 5060  REM  DEFINE BASIC CURVE
  509. 5070  FOR I = 0 TO M:P(0,I,1) = 0:P(0,I,2) = I *IY: NEXT I
  510. 5080 P(2,0,1) = 0:P(2,0,2) = 0:P(2,1,1) = 0:P(2,1,2) = IY
  511. 5090  FOR I = 2 TO M +10
  512. 5100 B1 = (I -1) *IY
  513. 5110 B2 = I *IY
  514. 5120 M1 = (RR -B1)/((I -1) *IX)
  515. 5130 M2 = (RR -B2)/(I *IX)
  516. 5140 P(2,I,1) = (B2 -B1)/(M1 -M2)
  517. 5150 P(2,I,2) = P(2,I,1) *M1 +B1
  518. 5160  GOSUB 500
  519. 5170  NEXT I
  520. 5180  REM  ROTATE AND TRANSLATE BASIC CURVE
  521. 5190 CA =  COS(AN -PI):SA =  SIN(AN -PI)
  522. 5200  FOR I = 0 TO M +10
  523. 5210 X = P(2,I,1) *CA -P(2,I,2) *SA
  524. 5220 Y = P(2,I,1) *SA +P(2,I,2) *CA +RM
  525. 5230 P(2,I,1) = X:P(2,I,2) = Y
  526. 5240  GOSUB 500
  527. 5250  NEXT I
  528. 5260  REM  CALCULATE END POINTS
  529. 5270 P(1,0,1) = 0:P(1,0,2) = RM
  530. 5280  FOR I = 1 TO M
  531. 5290 B1 = I *IY:M1 = (RR -B1)/(I *IX)
  532. 5300  FOR J = 1 TO M +10
  533. 5310  IF P(2,J,1) = P(2,J -1,1)  THEN M2 = 9999: GOTO 5330
  534. 5320 M2 = (P(2,J,2) -P(2,J -1,2))/(P(2,J,1) -P(2,J -1,1))
  535. 5330 X = (P(2,J -1,2) -P(2,J -1,1) *M2 -B1)/(M1 -M2)
  536. 5340  IF X <P(2,J -1,1)  OR X > = P(2,J,1) GOTO 5380
  537. 5350 P(1,I,1) = X
  538. 5360 P(1,I,2) = M1 *X +B1
  539. 5370  GOTO 5390
  540. 5380  NEXT J
  541. 5390  GOSUB 500
  542. 5400  NEXT I
  543. 5410  GOSUB 950
  544. 5420  REM  GRAPH ROUTINE
  545. 5430  FOR I = 0 TO N -1
  546. 5440 CA =  COS(2 *I *AN):SA =  SIN(2 *I *AN)
  547. 5450 X = 0:Y = 0
  548. 5460  GOSUB 5550
  549. 5470  NEXT I
  550. 5480  FOR I = 0 TO N -1
  551. 5490 CA =  COS(2 *I *AN +AN +PI):SA =  SIN(2 *I *AN +AN +PI)
  552. 5500 X =  -RM * SIN(2 *I *AN +AN):Y = RM * COS(2 *I *AN +AN)
  553. 5510  GOSUB 5550
  554. 5520  NEXT I
  555. 5530  RETURN 
  556. 5540  REM  LINE ROTATE, TRANSLATE, AND PLOT ROUTINE 
  557. 5550  HPLOT CX +X +P(1,0,1) *CA -P(1,0,2) *SA,CY -Y -P(1,0,1) *SA -P(1,0,2) *CA
  558. 5560  HPLOT  TO CX +X +P(0,0,1) *CA -P(0,0,2) *SA,CY -Y -P(0,0,1) *SA -P(0,0,2) *CA
  559. 5570  FOR J = 1 TO M
  560. 5580  HPLOT CX +X +P(1,J,1) *CA -P(1,J,2) *SA,CY -Y -P(1,J,1) *SA -P(1,J,2) *CA
  561. 5590  HPLOT  TO CX +X +P(0,J,1) *CA -P(0,J,2) *SA,CY -Y -P(0,J,1) *SA -P(0,J,2) *CA
  562. 5600  HPLOT  TO CX +X -P(1,J,1) *CA -P(1,J,2) *SA,CY -Y +P(1,J,1) *SA -P(1,J,2) *CA
  563. 5610  GOSUB 500
  564. 5620  NEXT J
  565. 5630  RETURN